#include "bsp_usart.h"
#include <stdio.h>
#include <string.h>
#include "gd32f4xx_rcu.h"               // GigaDevice::Device:StdPeripherals:RCU
#include "gd32f4xx_gpio.h"              // GigaDevice::Device:StdPeripherals:GPIO

#include "pindefine.h"
#include "log_record.h"

void init_usart_port(void)
{
	rcu_periph_clock_enable(RCU_UART6);
	
	nvic_irq_enable(UART6_IRQn, 2U,0U);
	
	gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP,BMC_TXD1_GPIO_PIN);

	
	gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP,BMC_RXD1_GPIO_PIN);
	gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, BMC_TXD1_GPIO_PIN);
	
	gpio_af_set(GPIOE, BMC_RXD1_GPIO_AF, BMC_RXD1_GPIO_PIN | BMC_TXD1_GPIO_PIN);
	
	
	usart_deinit(UART6);
	usart_baudrate_set(UART6, 115200U);
	usart_word_length_set(UART6,USART_WL_8BIT);
	usart_stop_bit_set(UART6,USART_STB_1BIT);
	usart_parity_config(UART6,USART_PM_NONE);
	
	usart_receive_config(UART6,USART_RECEIVE_ENABLE);
	usart_transmit_config(UART6, USART_TRANSMIT_ENABLE);
	
	usart_interrupt_enable(UART6, USART_INTEN_RBNEIE);
	
	usart_enable(UART6);
}

//配置 3A调试串口 监视串口
void init_usart_memo_port(void)
{
	rcu_periph_clock_enable(RCU_UART7);
	
	nvic_irq_enable(UART7_IRQn, 2U,0U);
	gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, LS3A_UART0_TXD_GPIO_PIN);
	gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, LS3A_UART0_RXD_GPIO_PIN);
	
	gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LS3A_UART0_TXD_GPIO_PIN|LS3A_UART0_RXD_GPIO_PIN);
	gpio_af_set(GPIOE, LS3A_UART0_TXD_GPIO_AF, LS3A_UART0_TXD_GPIO_PIN|LS3A_UART0_RXD_GPIO_PIN);
	
	usart_deinit(UART7);
	usart_baudrate_set(UART7, 115200U);
	usart_word_length_set(UART7, USART_WL_8BIT);
	usart_stop_bit_set(UART7, USART_PM_NONE);
	
	usart_receive_config(UART7, USART_RECEIVE_ENABLE);
	usart_interrupt_enable(UART7, USART_INTEN_RBNEIE);
	usart_enable(UART7);
}


//初始化与7A的交互通讯端口
void init_usart_7A_port(void)
{
	rcu_periph_clock_enable(RCU_UART3);
	
	nvic_irq_enable(UART3_IRQn, 2U,0U);
	gpio_mode_set(GPIOC,GPIO_MODE_AF, GPIO_PUPD_PULLUP, BMC_7A_RXD1_GPIO_PIN);
	gpio_mode_set(GPIOC,GPIO_MODE_AF, GPIO_PUPD_PULLUP, BMC_7A_TXD1_GPIO_PIN);
	
	gpio_output_options_set(GPIOC,GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, (BMC_7A_RXD1_GPIO_PIN|BMC_7A_TXD1_GPIO_PIN));
	gpio_af_set(GPIOC,BMC_7A_RXD1_GPIO_AF,(BMC_7A_RXD1_GPIO_PIN|BMC_7A_TXD1_GPIO_PIN));
	
	usart_deinit(UART3);
	usart_baudrate_set(UART3,115200U);
	usart_word_length_set(UART3,USART_WL_8BIT);
	usart_stop_bit_set(UART3,USART_PM_NONE);
	usart_transmit_config(UART3,USART_TRANSMIT_ENABLE);
	usart_receive_config(UART3, USART_RECEIVE_ENABLE);
	usart_interrupt_enable(UART3,USART_INTEN_RBNEIE);
	usart_enable(UART3);
}

void reset_usart_port(void)
{
	usart_deinit(UART6);
}
void reset_usart_memo_port(void)
{
	usart_deinit(UART7);
}
void reset_usart_7A_port(void)
{
	usart_deinit(UART3);
}

uint8_t vtgNeedRead = 0;
uint8_t logNeedRead = 0;

void UART6_IRQHandler(void)
{
	if(RESET!=usart_interrupt_flag_get(UART6, USART_INT_RBNEIE))
	{
		char tmpChar = usart_data_receive(UART6);
		
		if( tmpChar == 'l' )		//调试串口收到'l'指令，即读取Flash日志指令。在main函数中完成该指令动作。
		{
			logNeedRead = 1;
		}
		else if( tmpChar == 'v' )	//调试串口收到'v'指令，即读取本次开机记录的异常电压。在main函数中完成该指令动作。
		{
			vtgNeedRead = 1;
		}
		else if( tmpChar == 't' )	//调试串口收到'v'指令，即读取本次开机记录的异常电压。在main函数中完成该指令动作。
		{
			readCurrentAbnormalTemperature();
		}
		
		
		usart_data_transmit(UART7, tmpChar);
	}
}

char stringBuffer[32]={0};
char* stringMatchUP="Wait HT bus up";
char* stringMatchGood="After reconnect";
int strIndex=0;
int numCount=0;
int isInWait=0;

int logTimer = 0;
char logBuf[51200];
int logBufLength = 0;
char logSendBuf[51200];

void UART7_IRQHandler(void)
{
	if(RESET!=usart_interrupt_flag_get(UART7, USART_INT_RBNEIE))
	{
		char tmpChar=usart_data_receive(UART7);
		
		usart_data_transmit(UART6, tmpChar);
		if(logBufLength < 51200)
		{
			logBuf[logBufLength++] = tmpChar;
		}
		
		//第一次wait和第二次wait
		if(isInWait<2)
		{
			if(tmpChar == stringMatchUP[numCount])
			{
				numCount++;
				//usart_data_transmit(UART6, tmpChar);

							//计算是否长度相等
				if(numCount== strlen(stringMatchUP))
				{
					usart_data_transmit(UART6, '0'+isInWait);
					isInWait++;
					numCount=0;
				}
			}
			else
			{
				numCount=0;
			}
		}
		//第三次检测是否挂载好
		else if(isInWait==2)
		{
			if(tmpChar== stringMatchGood[numCount])
			{
				//usart_data_transmit(UART6, tmpChar);

				numCount++;
				if(numCount == strlen(stringMatchGood))
				{
					usart_data_transmit(UART6, '0'+isInWait);
					isInWait++;
					numCount=0;
				}
			}
			else
			{
				numCount=0;
			}
		}
		else
		{
			
		}
	}
}
